# Luaスクリプトのメモリ使用  様々なlua APIが使用者に自分の機能を実装の可能にする。でも、このプラットフォームでプログラムするのは色んな制限があります、その中、メモリの使用が一番です。 多分貴方が「マイコンのプログラミングがピーシーに違う、マイコンのリソースが大変厳しい」を知っています。このマイコンに、合計メモリは128キロバイトであります、現在、使用者に利用可能なメモリが80キロバイトくらいです。開発者がPCにのようでメモリを使用すると、速くメモリが不足になってしまいます。ただ、若干なルールを従うと、複雑な機能を実装するスクリプトを書くことが可能になります。 ### メモリ使用 このプロジェクトで、以下の部分のメモリを使います: - 静的に使用したBSSセグメントに、インタラプトのスタックとUSBのバッファーと画面のバッファーと色んな頻繁に使用するバッファー、変数を含みます。この部分は、今まで26キロバイトであります。 - UIのスタック、バックグラウンドなサービス(データキャプチャーやluaインタプリタや急速充電トリガー)、PCアプリのインターフェース、RTOSでクリエイトしたタスク。この部分20キロバイトであります。 - 残しました80キロバイトが空きます、luaスクリプトがこの部分を使用することができます。 ### メモリ使用量を監視する 開発者が、PCアプリで、「**Luaスクリプト**」パンネルで見えます。 スクリプトで: `sys.gFreeHeap()` を呼び出して空きヒープをゲットします `sys.gFreeHeapEver()` を呼び出して起動以来最大使用した時に空きヒープをゲットします `sys.gTotalHeap()` を呼び出して合計ヒープをゲットします ### lua言語の考え 80キロバイトのメモリが、随分多い機能を実装するできるでしょう。 ファームウェアが、46キロバイトで全ての機能実装した。 実は、他のファクターを含みましたら、状況は違う。 ファームウェアが全てC言語で実装しました、ただし、luaは動的で高水準なプログラミング言語ので、メモリ使用量が大きくなっている。例えば、number型(このプラットフォームでfloatにしました)luaで22バイトのメモリを占めます、Cで4バイトだけです。この例で、luaスクリプトが5倍のメモリを占めました。他にも、Cに比べて、関数の呼び出しや、バイトコードのロードや、メモリの使いが多い。 ### 主にはメモリのピーク使用量 組み込みシステムで、安定性が大事な考えであります、メモリの割り当ての失敗することができません。このシステムが、メモリの割り当てが失敗したら、すぐに全ての機能を停止すると、メモリ失敗のダイアログを表示することをデッサンしました。このエラーを解除すれば、再起動しかありません。 組み込み失敗したら、あなたのスクリプトが、リソースをリリースやダイアログを表示することができません。あなたのスクリプトが、ピークのメモリ使用量が絶対にマックスになれません。 ### ヒント1: スクリプトをモジュール化にする スクリプトを実行する時、全てのファイルをメモリに読み込みする、そして、バイトコードに翻訳をする。つまり、ある瞬間に、スクリプトとバイトコードが、同時にメモリを占めます。 考えある40キロバイトのスクリプト、40キロバイトのバイトコードにコンバートを想定します。メモリのピーク使用量は80キロバイト、これは随分ギリギリでしょう。 でも、四つのモジュール、一つが10キロバイト、10キロバイトのコンバートしたバイトコードを想20定、こうすると、全て`require`でロードの時、ピークなメモリ使用量がは40+10=50キロバイトになりました。 ### ヒント2: コードをプリコンパイルする 普通に、ヒント1がメモリ使用をいい範囲にするのは十分ですが、あなたがコンパイルにのメモリピークを消すことができます。`sys.gByteCode({path},[option])`を実行すると、入力ファイルの同じディレクトリで *.lc の出力ができます。オプションのパラメータ`sys.RESERVE_DEBUG_INFO`を使えれば、デバッグ情報を残すことができます。 下記がどのくらいにメモリをセーブできるの例です: テストファイル UI_Demo.lua サイズ5.23キロバイト | 条件 | ピークメモリ使用量 | | ------ | ------ | | *.lua 直接に | 29.64KB| | *.lc RESERVE_DEBUG_INFO | 19.52KB | | *.lc STRIP_DEBUG_INFO | 16.00KB |